package admin

import (
	"github.com/gin-gonic/gin"
	"mojieshi/define"
	"mojieshi/models"
	"net/http"
	"strconv"
	"time"
)

// 用户等级结构
type UserAdminGroupF struct {
	ID             int             `json:"id"`
	Bid            int             `json:"bid"`             //商户ID
	Name           string          `json:"name"`            //等级名称
	JurisdictionId string          `json:"jurisdiction_id"` //权限
	Jurisdiction   string          `json:"jurisdiction"`    //权限
	Descr          string          `json:"descr"`           //具体描述
	CreatedAt      int             `json:"created_at"`
	UpdatedAt      int             `json:"updated_at"`
	MR             []int           `json:"MR"`
	NameEn         []TranslateData `json:"name_en"` //语种列表
}
type Newdata struct {
	Id           int    `json:"id"`
	Aid          int    `json:"aid"`
	Jid          int    `json:"jid"`
	Name         string `json:"name"`
	SubName      string `json:"sub_name"`
	Bid          int    `json:"bid"`    //商户ID
	Status       int    `json:"status"` //状态 1开启
	Type         int    `json:"type"`
	CreatedStart string `json:"created_start"` //开始时间
	CreatedEnd   string `json:"created_end"`   //结束时间
	Page         int    `json:"page"`
	Limit        int    `json:"limit"`
}

func UserAdminGroup(c *gin.Context) {
	//获取数据
	var jsonData Newdata
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		define.Response.ResultFail(c, 10000, define.JsonData, "")
		return
	}
	var groupList []models.MAdminGroup
	var count int64
	if jsonData.Page == 0 {
		jsonData.Page = -1
	}
	if jsonData.Limit == 0 {
		jsonData.Limit = -1
	}
	//计算指定在开始返回记录之前要跳过的记录数量
	offsetVal := (jsonData.Page - 1) * jsonData.Limit
	//判断如果分页和数量全等于-1，则不开启分页
	if jsonData.Page == -1 || jsonData.Limit == -1 {
		offsetVal = -1
	}
	tx := models.DB.Model(new(models.MAdminGroup)).Where("is_show=? AND bid=?", 1, jsonData.Bid)

	if jsonData.Id > 0 {
		tx = tx.Where("id=?", jsonData.Id)
	}
	tx = tx.Count(&count).Limit(jsonData.Limit).Offset(offsetVal).Find(&groupList)
	if tx.Error != nil {
		c.JSON(http.StatusOK, gin.H{
			"success": false,
			"code":    10002,
			"msg":     tx.Error,
		})
		return
	}
	var list []UserAdminGroupF
	for _, v := range groupList {
		var TranslateList []TranslateData
		err = models.DB.Model(new(models.MTranslate)).Where("as_id=? AND as_from=?", v.ID, "m_admin_group").Find(&TranslateList).Error
		if err != nil {
			define.Response.ResultFail(c, 10001, err.Error(), "")
			return
		}
		list = append(list, UserAdminGroupF{
			ID:     v.ID,
			Name:   v.Name,
			Descr:  v.Descr,
			NameEn: TranslateList,
		})
	}
	//为每个等级循环获取权限列表
	for i := 0; i < len(list); i++ {
		var listData []int
		err = models.DB.Table("m_rolt").Select("m_rolt.menu_id").Where("m_rolt.role_id=?", list[i].ID).Find(&listData).Error
		if err != nil {
			define.Response.ResultFail(c, 10002, err.Error(), "")
			return
		}
		list[i].MR = listData
	}
	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"code":    0,
		"data": map[string]interface{}{
			"list":  list,
			"count": count,
		},
	})
}

type UserAdminGroupEdit struct {
	ID             int             `json:"id"`
	Bid            int             `json:"bid"`             //商户ID
	Name           string          `json:"name"`            //等级名称
	JurisdictionId string          `json:"jurisdiction_id"` //权限
	Jurisdiction   string          `json:"jurisdiction"`    //权限
	Descr          string          `json:"descr"`           //具体描述
	IsShow         int             `json:"is_show"`         //0显示 1隐藏
	OperatorUid    int             `json:"operator_uid"`    //操做人
	NameEn         []TranslateData `json:"name_en"`         //语种列表
}

// 等级新增与修改
func UserAdminGroupAdd(c *gin.Context) {
	//接收数据
	var jsonData UserAdminGroupEdit
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 10000,
			"msg":  err,
		})
		return
	}
	tx := models.DB.Begin() //开启事务
	if jsonData.ID > 0 {
		var data = map[string]interface{}{
			"name":            jsonData.Name,
			"jurisdiction":    jsonData.Jurisdiction,
			"descr":           jsonData.Descr,
			"jurisdiction_id": jsonData.JurisdictionId,
		}
		err = tx.Model(new(models.MAdminGroup)).Where("id=?", jsonData.ID).Updates(&data).Error
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"code": 10002,
				"msg":  err.Error(),
			})
			tx.Rollback()
			return
		}
		//查询是否存在原有数据,有就删除
		err = TranslateDel(tx, jsonData.ID, "m_admin_group")
		if err != nil {
			define.Response.ResultFail(c, 20001, err.Error(), "")
			tx.Rollback()
			return
		}
		//批量插入数据
		var listData []models.MTranslate
		for _, v := range jsonData.NameEn {
			listData = append(listData, models.MTranslate{
				AsId:      jsonData.ID,
				CreatedAt: int(time.Now().Unix()),
				AsFrom:    "m_admin_group",
				Name:      v.Name,
				Languages: v.Languages,
				Remarks:   v.Remarks,
			})
		}
		//批量插入翻译
		err = tx.Model(new(models.MTranslate)).Create(&listData).Error
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"code": 10002,
				"msg":  err.Error(),
			})
			tx.Rollback()
			return
		}
		//写入日志
		userName, bid := models.UserName(jsonData.OperatorUid)
		logData := "管理员：" + userName + "，修改了等级id:" + strconv.Itoa(jsonData.ID) + "的内容"
		models.LogAdd(3, "修改等级", jsonData.OperatorUid, logData, bid, 38)
	} else {
		var data models.MAdminGroup
		data.Name = jsonData.Name
		data.Jurisdiction = jsonData.Jurisdiction
		data.JurisdictionId = jsonData.JurisdictionId
		data.Descr = jsonData.Descr
		data.IsShow = jsonData.IsShow
		data.Bid = jsonData.Bid
		err = models.DB.Model(new(models.MAdminGroup)).Create(&data).Error
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"code": 10001,
				"msg":  err.Error(),
			})
		}
		//批量插入数据
		var listData []models.MTranslate
		for _, v := range jsonData.NameEn {
			listData = append(listData, models.MTranslate{
				AsId:      data.ID,
				CreatedAt: int(time.Now().Unix()),
				AsFrom:    "m_admin_group",
				Name:      v.Name,
				Languages: v.Languages,
				Remarks:   v.Remarks,
			})
		}
		//批量插入翻译
		err = tx.Model(new(models.MTranslate)).Create(&listData).Error
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"code": 10002,
				"msg":  err.Error(),
			})
			tx.Rollback()
			return
		}
		//写入日志
		userName, bid := models.UserName(jsonData.OperatorUid)
		logData := "管理员：" + userName + "，新增了一个等级:" + jsonData.Name
		models.LogAdd(2, "新增等级", jsonData.OperatorUid, logData, bid, 38)
	}
	tx.Commit()
	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"code":    0,
		"msg":     "成功！",
	})
}

// 删除等级
func UserAdminGroupDel(c *gin.Context) {
	//获取管理员id
	var jsonData models.MAdminGroup
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 10000,
			"msg":  err,
		})
		return
	}
	var data models.MAdminGroup
	models.DB.Model(new(models.MAdminUser)).Where("id=?", jsonData.ID).First(&data)
	tx := models.DB.Begin()
	//查询是否存在原有数据,有就删除
	err = TranslateDel(tx, jsonData.ID, "m_menu")
	if err != nil {
		define.Response.ResultFail(c, 20001, err.Error(), "")
		tx.Rollback()
		return
	}
	//删除
	err = tx.Delete(&models.MAdminGroup{}, jsonData.ID).Error
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 10004,
			"msg":  err.Error(),
		})
		tx.Rollback()
		return
	}
	tx.Commit()
	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"code":    0,
		"msg":     "成功！",
	})
	//写入日志
	userId, err := strconv.Atoi(c.GetHeader("userId")) //将字符串转为int
	userName, bid := models.UserName(userId)
	logData := "管理员：" + userName + "，删除了一个等级:" + data.Name
	models.LogAdd(4, "删除等级", userId, logData, bid, 38)
}
